package Utils;
import Bean.*;

import java.util.ArrayList;

public class StateUtils {


    public static void reback(MindMap mindMap, MindMapTemp temp){
        MindMapNode center = mindMap.getCenter();
        center.setTextProperty(temp.getCenter().getText());
        center.setX(temp.getCenter().getX());
        center.setY(temp.getCenter().getY());
        rebackOfNode(center,temp.getCenter());
        rebackOfLine(mindMap, temp);
    }

    private static void rebackOfNode(MindMapNode target, MindMapNodeTemp temp){
        int sizeOfTargetNodes = target.getChildNode().size();
        int sizeOfTempNodes = temp.getNodes().size();
        if(sizeOfTargetNodes>=sizeOfTempNodes){
            aboveRebackOfNode(target,temp);
        }else{
            belowRebackOfNode(target,temp);
        }
    }

    private static void belowRebackOfNode(MindMapNode target,MindMapNodeTemp temp){
        ArrayList<MindMapNode> targetNodes = target.getChildNode();
        ArrayList<MindMapNodeTemp> tempNodes = temp.getNodes();
        int index = -1;
        for(int i = 0;i<targetNodes.size();i++){
            MindMapNodeTemp t = tempNodes.get(i);
            MindMapNode m = targetNodes.get(i);
            m.setTextProperty(t.getText());
            m.setParentNode(target);
            m.setX(t.getX());
            m.setY(t.getY());
            rebackOfNode(m,t);
            index = i;
        }
//        int len = tempNodes.size()-targetNodes.size();
        for(int i = index+1;i<tempNodes.size();i++){
            MindMapNodeTemp t = tempNodes.get(i);
            MindMapNode m = new MindMapNode(t.getText());
            m.setParentNode(target);
            m.setX(t.getX());
            m.setY(t.getY());
            targetNodes.add(m);
        }
    }

    private static void aboveRebackOfNode(MindMapNode target,MindMapNodeTemp temp){
        ArrayList<MindMapNode> targetNodes = target.getChildNode();
        ArrayList<MindMapNodeTemp> tempNodes = temp.getNodes();
        int index = -1;
        for(int i = 0;i<tempNodes.size();i++){
            MindMapNodeTemp t = tempNodes.get(i);
            MindMapNode m = targetNodes.get(i);
//            MindMapNode parentOfM = m.getParentNode();
//            MindMapNodeTemp parentOfT = t.getParent();
//            parentOfM.setTextProperty(parentOfT.getText());
//            parentOfM.setX(parentOfT.getX());
//            parentOfM.setY(parentOfT.getY());
            m.setTextProperty(t.getText());
            m.setX(t.getX());
            m.setY(t.getY());
            index = i;
            rebackOfNode(m,t);
        }
//        int len = targetNodes.size()-tempNodes.size();
        for(int i = index+1 ; i<targetNodes.size();i++){
            targetNodes.remove(i);
        }
    }

    private static void rebackOfLine(MindMap target,MindMapTemp temp){
        int sizeOfTargetLine = target.getLines().size();
        int sizeOfTempLine = temp.getLines().size();
        if(sizeOfTargetLine>=sizeOfTempLine){
            aboveRebackOfLine(target, temp);
        }else if(sizeOfTargetLine<sizeOfTempLine){
            belowRebackOfLine(target,temp);
        }
    }

    private static void belowRebackOfLine(MindMap target,MindMapTemp temp){
        ArrayList<MindMapLine> targetLines = target.getLines();
        ArrayList<MindMapLineTemp> tempLines = temp.getLines();
        int index = -1;
        for(int i = 0;i<targetLines.size();i++){
            MindMapLine m = targetLines.get(i);
            MindMapLineTemp t = tempLines.get(i);
            MindMapNode beginNode = m.getBeginNode();
            beginNode.setX(t.getBeginNode().getX());
            beginNode.setY(t.getBeginNode().getY());
            MindMapNode endNode = m.getEndNode();
            endNode.setX(t.getEndNode().getX());
            endNode.setY(t.getEndNode().getY());
            index = i;
        }
//        int len = tempLines.size() - targetLines.size();
        for(int i = index+1 ; i<tempLines.size();i++){
            MindMapLineTemp t = tempLines.get(i);
            MindMapLine m = new MindMapLine(t.getBegin(),getEndNode(t.getEnd(),target.getCenter()),t.getBeginX()+50,t.getBeginY()+20,t.getEndX()+50,t.getEndY()+20);
            targetLines.add(m);
        }
    }

    private static void aboveRebackOfLine(MindMap target,MindMapTemp temp){
        ArrayList<MindMapLine> targetLines = target.getLines();
        ArrayList<MindMapLineTemp> tempLines = temp.getLines();
        int index = -1;
        for(int i = 0;i<tempLines.size();i++){
            MindMapLine m = targetLines.get(i);
            MindMapLineTemp t = tempLines.get(i);
            MindMapNode beginNode = m.getBeginNode();
            beginNode.setX(t.getBeginNode().getX());
            beginNode.setY(t.getBeginNode().getY());
            MindMapNode endNode = m.getEndNode();
            endNode.setX(t.getEndNode().getX());
            endNode.setY(t.getEndNode().getY());
            index = i;
        }
//        int len = targetLines.size() - tempLines.size();
        for(int i = index+1 ; i<targetLines.size();i++){
            targetLines.remove(i);
        }
    }

    private static MindMapNode getEndNode(MindMapNode temp,MindMapNode target){
        ArrayList<MindMapNode> nodes = target.getChildNode();
        MindMapNode t = null;
        for(MindMapNode m : nodes){
            if(m.getX()==temp.getX()&&m.getY()==temp.getY()&&m.getTextProperty().equals(temp.getTextProperty())){
                return m;
            }
            t = getEndNode(temp,m);
        }
        return t;
    }

}
